home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / PASCAL / 0391B.ZIP / RANDOM.PAS < prev    next >
Pascal/Delphi Source File  |  1987-02-22  |  4KB  |  88 lines

  1. program RandomTest;
  2. {
  3.        This program tests out the Randomize procedure.  It also
  4.        calculates a chi-square value as a test of Random itself.
  5.        Chi-square values between 3 and 16 are desirable, with
  6.        values close to 8.3 being optimum.
  7. }
  8. var
  9.   S1,S2,Indx,Jndx,Count  : Integer;
  10.   Sum,T,NP               : Real;
  11.   Tally                  : array[0..9] of Integer;
  12. {
  13.    Randomize Procedure For MS-DOS & PC-DOS Turbo Pascal
  14.  
  15.    This new Randomize has two Integer parameters.  If they are both 0, then
  16. the random number seed is set randomly.  If either of the parameters is
  17. nonzero, then they are both stored directly into the 32 bit seed.
  18.  
  19.    To set the seed randomly (Randomize(0,0)), the procedure calls MS-DOS
  20. to get the current time.  This is a 32 bit value, which is also stored
  21. directly into the seed.  On some systems, (i.e. the NCR Decision Mate V),
  22. the clock does not tick, so the time never changes.  Randomize checks this,
  23. and if the clock hasn't changed after a Delay(100), it asks the user to hit
  24. a key.  While waiting for the key, it continuously increments two counters.
  25. These are then stored into the seed.
  26.  
  27. { Please note:  This routine is for MS-Dos/PC-Dos Turbo ONLY! }
  28.  
  29. procedure Randomize(I,J: Integer);
  30.  
  31. var
  32.   RSet    : record
  33.               AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: Integer;
  34.             end;
  35.   Ch      : Char;
  36.  
  37. begin
  38.   if (I=0) and (J=0) then begin     { Generate a random random number seed }
  39.     RSet.AX:=$2C00;                             { DOS time of day function }
  40.     MSDos(RSet);
  41.     I:=RSet.CX;                           { Set I and J to the system time }
  42.     J:=RSet.DX;
  43.     Delay(100);   { This delay may have to be increased for faster systems }
  44.     MSDos(RSet);
  45.     if (I=RSet.CX) and (J=RSet.DX) then begin        { Clock isn't ticking }
  46.       I := 0;
  47.       J := 0;
  48.       while KeyPressed do
  49.         Read(Kbd,Ch);                              { Clear keyboard buffer }
  50.       Write('Hit any key to set the random number generator: ');
  51.       repeat
  52.         I := I+13;
  53.         J := J+17
  54.       until Keypressed;
  55.       Read(Kbd,Ch);                                 { Absorb the character }
  56.       WriteLn
  57.     end
  58.   end;
  59.   MemW[DSeg:$129]:=I;  { This is the core of the routine: store a 32 bit }
  60.   MemW[DSeg:$12B]:=J;  {  seed at locations DSeg:$0129...DSeg:$012C      }
  61. end; { of procedure Randomize }
  62.  
  63. begin  { main body of program RandomTest }
  64.   Writeln('Enter count <= 0 to end program');
  65.   repeat
  66.     Write('Enter count:          ');           { get # of samples }
  67.     ReadLn(Count);
  68.     if Count > 0 then begin                    { do random number test }
  69.       Write('Enter seeds (S1 S2):  ');         { get 2 integers for seed }
  70.       ReadLn(S1,S2);
  71.       Randomize(S1,S2);                        { set random number seed }
  72.       FillChar(Tally,SizeOf(Tally),0);         { clear tally array }
  73.       for Indx := 1 to Count do begin          { generate Count numbers }
  74.         Jndx := Random(10);                    { range is 0..9 }
  75.         Tally[Jndx] := Tally[Jndx] + 1         { count how many of each }
  76.       end;
  77.       Sum := 0.0;                              { clear sum for X^2 }
  78.       NP := Count/10.0;                        { theoretical number for each }
  79.       for Indx := 0 to 9 do begin              { for each possible result do }
  80.         Write(Tally[Indx]:5);                  { write total for that value }
  81.         Sum := Sum + Sqr(Tally[Indx]-NP)/NP    { and calculate X^2 }
  82.       end;
  83.       WriteLn;
  84.       WriteLn('Chi-Square (9 degrees of freedom) = ',Sum:8:3)
  85.     end
  86.   until Count <= 0
  87. end. { of program RandomTest }
  88.